
package com.ctrip.corp.obt.shard.sql.parser.permission;


import com.ctrip.corp.obt.generic.utils.StringUtils;
import com.ctrip.corp.obt.shard.configuration.DataShardProperties;
import com.ctrip.corp.obt.shard.context.PermissionContext;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import net.sf.jsqlparser.expression.StringValue;
import net.sf.jsqlparser.expression.operators.relational.ExpressionList;

import java.util.Arrays;
import java.util.Optional;
import java.util.stream.Collectors;

/**
 * 权限处理器
 *
 * @author marco.zheng
 * @since 2022-02-10
 */
@Slf4j
@RequiredArgsConstructor
public class DefaultPermissionHandler implements PermissionHandler {

    private final DataShardProperties dataShardProperties;

    /**
     * 获取组织 ID 值表达式，支持多个 ID 条件查询
     *
     * @return 组织 ID 值表达式
     */
    public ExpressionList getOrgIds() {
        String orgIds = Optional.ofNullable(PermissionContext.getOrgIds()).orElse(StringUtils.EMPTY);
        return new ExpressionList(Arrays.stream(orgIds.split(",")).map(String::trim).map(StringValue::new).collect(Collectors.toList()));
    }

    /**
     * 获取公司 ID 值表达式，支持多个 ID 条件查询
     *
     * @return 公司 ID 值表达式
     */
    @Override
    public ExpressionList getCorpIds() {
        String corpIds = Optional.ofNullable(PermissionContext.getCorpIds()).orElse(StringUtils.EMPTY);
        return new ExpressionList(Arrays.stream(corpIds.split(",")).map(String::trim).map(StringValue::new).collect(Collectors.toList()));
    }

    /**
     * 获取组织字段名
     *
     * @return 租户字段名
     */
    public String getOrgIdColumn() {
        // 对应数据库租户ID的列名，是数据库列名，不是实体类
        return "org_id";
    }

    @Override
    public String getCorpIdColumn() {
        return "corp_id";
    }

    /**
     * 根据表名判断是否进行过滤
     *
     * @param tableName 表名
     * @return 是否进行过滤, true:表示忽略，false:需要解析多租户字段
     */
    public boolean ignoreTable(String tableName) {
        // 是否需要需要过滤某一张表，false为不过滤
        return dataShardProperties.isFilterTable(tableName);
    }
}
